#if 0
// 设备树格式
gpio-keys {
			compatible = "gpio-keys";
			autorepeat;

            // gpio方式最多
			up {
				label = "GPIO Key UP";
				linux,code = <103>;
				gpios = <&gpio1 0 1>;
			};

			down {
				label = "GPIO Key DOWN";
				linux,code = <108>;
				interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
			};
        }

对于input/gpio_keys.c键盘驱动的设备树绑定

必要属性：
- compatible = "gpio-keys";

可选属性：
- autorepeat: 布尔值，启用Linux输入子系统的自动重复功能。
- label: 字符串，输入设备的名称。

每个按钮（键）都在"gpio-keys"下作为子节点表示：
子节点属性：

- gpios: OF设备树GPIO规范。
- interrupts: 该输入的中断线。
- label: 键的描述名称。
- linux,code: 发出的按键代码。

注意，可以省略"interrupts"或"gpios"属性中的任何一个，但不能同时省略。允许同时指定这两个属性。

可选的子节点属性：
	- linux,input-type: 指定此按钮/键产生的事件类型。
	  如果未指定，默认为 <1> == EV_KEY。
	- debounce-interval: 防抖间隔时间，单位为毫秒。
	  如果未指定，默认为5。
	- wakeup-source: 布尔值，按钮可以唤醒系统。
			 (支持的旧属性： "gpio-key,wakeup")
	- linux,can-disable: 布尔值，表示按钮连接到可以被禁用以抑制来自按钮的事件的专用（非共享）中断。


    你可以通过打开并读取 /dev/input/eventX 设备文件来获取键盘的按键事件，其中 X 是具体的设备数字。设备每次发布的事件都遵循以下的结构体：

    struct input_event {
        struct timeval time;
        unsigned short type;
        unsigned short code;
        unsigned int value;
    };

    你可以看到，它由4部分组成：

    time：事件发生的时间。
    type：事件的类型。对于键盘设备，需要关注的类型是 EV_KEY。
    code：对于 EV_KEY 类型的事件，这个值就是键盘的键码。
    value：对于 EV_KEY 类型的事件，这个值代表按键的状态，1为按下，0为释放，2为连续按下。

            
    0000000 ade3 386d 056a 000f 0001 006c 0001 0000
    0000010 ade3 386d 056a 000f 0000 0000 0000 0000
    0000020 ade4 386d 8ab5 0000 0001 006c 0000 0000
    0000030 ade4 386d 8ab5 0000 0000 0000 0000 0000

#endif

#include <stdio.h>
#include <linux/input.h>
#include <fcntl.h>
#include <unistd.h>

#define DEV_PATH "/dev/input/event5"   //根据需要修改为你的键盘对应的设备文件，可以直接sudo cat /dev/input/event5并按键盘，看是否有输出，见附图


int main()
{
    int keys_fd;  //文件标志
    char ret[2];
    struct input_event t;  //读取到的input设备数据是一个结构体

    keys_fd = open(DEV_PATH, O_RDONLY);  //权限不通过的时候一般会返回-1
    if(keys_fd <= 0) {
        printf("open /dev/input/event2 device error!\n");
        return -1;
    }
    while(1)
    {
        /** keys_fd指向打开的设备文件，read将从设备文件传送sizeof(t)个字节的数据到&t这个内存地址。
         * 函数执行顺利的话返回值是实际读取的字节数
         */
        if(read(keys_fd, &t, sizeof(t)) == sizeof(t)) {
            if(t.type == EV_KEY) {
                if (t.value == 103 || t.value == 108) {
                    printf("key %d %s\n", t.code, (t.value) ? "Pressed" : "Released");  //t.code值所对应的按键在/usr/include/linux/input-event-codes.h可以查到
                }
            }
        }
    }
    close(keys_fd);

    return 0;
}